'use strict';

const LOWEST_NODE_VERSION = '13.0.0'
const semver = require('semver')
const colors = require('colors/safe');
const log = require('@ting-cli-dev/log')

class Command {
    constructor(argv) {
        // console.log('Command----constructor', argv);
        if (!argv) {
            throw new Error('参数不能为空')    
        }

        if (!Array.isArray(argv)) {
            throw new Error('参数必须为数组')    
        }

        if (argv.length === 0) {
            throw new Error('参数数组不能为空')    
        }

        this._argv = argv
        this.runner = new Promise((resolve, reject) => {
            let chain = Promise.resolve()
            chain.then(() => {
                // node 版本判断
                this.checkNodeVersion();
            })
            // 初始化参数
            chain.then(() => this.initArgs())
            // 初始化
            chain.then(() => this.init())
            // 执行
            chain.then(() => this.exec ())
            chain.catch(err => {
                log.error(err.message)
            })
        })
    }

    checkNodeVersion() { 
        // 第一步： 获取 node 版本号
        const currentNodeVersion = process.version;
        // 第二步： 比较最低版本号
        const lowestNodeVersion = LOWEST_NODE_VERSION;
        if (!semver.gt(currentNodeVersion, lowestNodeVersion)) {
            throw new Error(colors.red(`ting-cli-dev 需要安装 v${lowestNodeVersion} 以上版本的 nodejs`))
        }
        
    }

    initArgs() {
        this._cmd = this._argv[this._argv.length - 1]
        this._argv = this._argv.slice(0, this._argv.length - 1)
    }

    init() {
        throw new Error('init 函数必须被实现')
    }

    exec() {
        throw new Error('exec 函数必须被实现')
    }

}


module.exports = Command;

